//package top.jiangqiang.qyblog.core.db;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.date.DatePattern;
//import cn.hutool.core.date.DateUtil;
//import cn.hutool.core.util.ReflectUtil;
//import lombok.RequiredArgsConstructor;
//import org.springframework.stereotype.Component;
//import top.jiangqiang.qyblog.common.utils.FileUtil;
//import top.jiangqiang.qyblog.common.utils.JSONUtil;
//import top.jiangqiang.qyblog.common.utils.SpringUtil;
//import top.jiangqiang.qyblog.core.base.entity.BaseEntity;
//import top.jiangqiang.qyblog.core.base.service.BaseService;
//
//import java.io.File;
//import java.lang.reflect.Field;
//import java.lang.reflect.Modifier;
//import java.nio.charset.StandardCharsets;
//import java.time.LocalDateTime;
//import java.util.Date;
//import java.util.List;
//
///**
// * @author Jiangqiang
// * @version 1.0
// * @date 2022/12/9 16:09
// */
//@Component
//@RequiredArgsConstructor
//public class Backupervice {
//
//    /**
//     * 备份到指定目录，会在该目录下根据日期创建子目录
//     *
//     * @param dir 指定目录
//     */
//    @SuppressWarnings("unchecked")
//    public void dbToJson(File dir) {
//        //获取所有service名字
//        String[] beanNamesForType = SpringUtil.getBeanNamesForType(BaseService.class);
//        for (String name : beanNamesForType) {
//            BaseService<? extends BaseEntity> service = SpringUtil.getBean(name);
//            File destFile = FileUtil.file(FileUtil.file(dir, DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN)), service.getTableName() + ".json");
//            List<? extends BaseEntity> all = service.list();
//            if (CollUtil.isNotEmpty(all)) {
//                all.forEach(this::clearValue);
//                FileUtil.writeString(JSONUtil.toJsonPrettyStr(all), destFile, StandardCharsets.UTF_8);
//            }
//        }
//    }
//
//    /**
//     * json转对象后，设置对应的时间字段
//     *
//     * @param baseEntity
//     */
//    public void setValue(BaseEntity baseEntity) {
//        LocalDateTime now = LocalDateTime.now();
//        baseEntity.setCreateTime(now);
//        baseEntity.setUpdateTime(now);
//    }
//
//    /**
//     * 数据转储到json之前，去除相关的时间字段
//     *
//     * @param baseEntity
//     */
//    public void clearValue(BaseEntity baseEntity) {
//        baseEntity.setCreateTime(null);
//        baseEntity.setUpdateTime(null);
//        Field[] fields = ReflectUtil.getFields(baseEntity.getClass());
//        for (Field field : fields) {
//            Class<?> superclass = field.getType().getSuperclass();
//            //成员变量为BaseEntity类型（关联关系中关联的对象，只需要序列化id即可，其他属性需要全部忽略）
//            if (BaseEntity.class.equals(superclass)) {
//                BaseEntity fieldValue = (BaseEntity) ReflectUtil.getFieldValue(baseEntity, field);
//                if (fieldValue != null) {
//                    Long id = fieldValue.getId();
//                    //BaseEntity类型的成员属性的所有字段
//                    Field[] memberFields = ReflectUtil.getFields(fieldValue.getClass());
//                    for (Field memberField : memberFields) {
//                        //清空所有非静态属性
//                        if (!Modifier.isStatic(memberField.getModifiers())) {
//                            ReflectUtil.setFieldValue(fieldValue, memberField, null);
//                        }
//                        //设置之前的id
//                        fieldValue.setId(id);
//                    }
//                }
//            }
//        }
//    }
//
//}
